#ifndef POINT_TYPES_H_
#define POINT_TYPES_H_
 
 
 
#include <Eigen/Core>
#include <ostream>
 
 
    typedef Eigen::Map<Eigen::Vector4f, Eigen::Aligned> Vector4fMap;
    typedef const Eigen::Map<const Eigen::Vector4f, Eigen::Aligned> Vector4fMapConst;
 
    struct EIGEN_ALIGN16 PointXYZ 
    {
        union EIGEN_ALIGN16  {
             
            float data[4]; 
            struct {
                 
                float x; 
                float y; 
                float z; 
            }; 
        };
 
 
        inline PointXYZ()
        {
            x = y = z = 0.0f;
            data[3] = 1.0f;
        }
 
        inline PointXYZ(float _x, float _y, float _z)
        {
            x = _x; y = _y; z = _z;
            data[3] = 1.0f;
        }
 
        inline Vector4fMap getVector4fMap() {return (Eigen::Vector4f::MapAligned(data));} 
        inline Vector4fMapConst getVector4fMap() const { return (Eigen::Vector4f::MapAligned(data)); } 
 
        friend std::ostream& operator << (std::ostream& os, const PointXYZ& p);
        EIGEN_MAKE_ALIGNED_OPERATOR_NEW
    };
 
 
 
 
 
 
#endif
